/**
 *  @file BasicOperate.c
 *  @desc 实现顺序栈的基本操作：初始化、压栈、出栈、栈顶、判断空/满、打印
 *  @author WangBlue
 *  @date 2025-07-28 11:45
 *  @version 1.0
 */

#include <stdio.h>
#include <stdbool.h>

// 栈容量上限
#define MAX_SIZE 100

typedef int EleType;  // 定义栈中元素类型为 int

// 栈结构体定义
typedef struct stack {
    EleType top;              // 栈顶指针，指向当前栈顶元素的下标
    EleType data[MAX_SIZE];   // 栈元素数组
} stack;

// 初始化栈：top 初始化为 -1，表示空栈
void initStack(stack *s) {
    s->top = -1;
    for (int i = 0; i < MAX_SIZE; i++) {
        s->data[i] = 0;  // 可选：初始化每个元素为 0（非必要）
    }
}

// 判断栈是否已满（top 指向最后一个可用位置）
bool isFill(stack *s) {
    return s->top == MAX_SIZE - 1;
}

// 判断栈是否为空
bool isEmpty(stack *s) {
    return s->top == -1;
}

// 压栈操作：若栈未满，将 value 放入栈顶
void push(stack *s, EleType value) {
    if (isFill(s)) return;  // 栈满则不做操作
    s->top = s->top + 1;    // top 向上移动
    s->data[s->top] = value;
}

// 打印整个栈
void printStack(stack *s) {
    if (s->top == -1) return;  // 空栈不打印
    printf("Stack (top=%d) \n", s->top + 1);  // 显示元素数量
    for (int i = 0; i <= s->top; i++) {
        printf("value is %d\n", s->data[i]);
    }
    printf("\n");
}

// 出栈操作：若非空，取出栈顶元素到 *value，并返回 true
bool pop(stack *s, EleType *value) {
    if (isEmpty(s)) return false;  // 空栈无法出栈
    *value = s->data[s->top];      // 获取栈顶值
    s->top--;                      // top 下移
    return true;
}

// 获取栈顶元素但不出栈
bool peek(stack *s, EleType *value) {
    if (isEmpty(s)) return false;
    *value = s->data[s->top];
    return true;
}

// 主函数：测试栈的基本功能
int main() {
    stack s;
    initStack(&s);  // 初始化栈

    // 压栈：依次压入 1, 2, 3, 4
    push(&s, 1);
    push(&s, 2);
    push(&s, 3);
    push(&s, 4);

    // 出栈：弹出栈顶元素
    int data = 0;
    pop(&s, &data);
    printf("data is %d\n", data);  // 输出被弹出的值

    // 打印当前栈内容
    printStack(&s);

    return 0;
}
